//
// Created by 李传智 on 2018/4/12.
//

#ifndef ANDSDK_IDECODE_H
#define ANDSDK_IDECODE_H

#include "CodecParameter.h"
#include "IObserver.h"
#include <list>

// 解码接口，支持硬解码
class IDecode : public IObserver {

public:

    // 打开解码器
    virtual bool open(CodecParameter codecParameter, bool isHard = false) = 0;

    virtual void close() = 0;

    // future 模型
    // 发送数据到线程解码
    virtual bool sendPacket(VideoData pkt) = 0;

    // 从线程中获取解码结果，再次调用会复用上次的空间，线程不安全
    virtual VideoData receiveFrame() = 0;

    // 从 demux 获取到的数据, 如果已达到最大缓冲队列数(maxPackets)，会阻塞调用线程
    virtual void update(VideoData data);

    // 最大的队列缓冲数
    int maxPackets = 100;

    // 同步音频时间，再次打开文件要清零
    int64_t syncPts = 0;

    // 当前 pts
    int64_t pts = 0;

    // 清理
    virtual void clear();

protected:
    // 解码器类型
    int codecType = 0;

    // 是否是音频
    bool isAudio = false;

    // 线程入口函数
    virtual void main();

    // 所有的缓冲帧
    std::list<VideoData> pkts;

    // 互斥锁
    std::mutex pktMutex;
};


#endif //ANDSDK_IDECODE_H
